延續前一篇的建置流程,我們已完成程式碼編譯與「配置渲染」,並產出了包含環境設定的 Zip 壓縮檔。本篇將實作如何跨網路將產出物安全送達目標主機,並在部署成功後,透過 Jenkins 自動在 GitHub 的 Pull Request (PR) 下方進行即時反饋。
在混合雲或異質環境中,Jenkins Agent 可能運行於 Linux,而部署目標則是 Windows 伺服器。我們採用 OpenSSH for Windows 作為兩者間的通訊橋樑,實現標準化的指令與檔案傳輸。
我們利用 sshpass 處理非互動式的密碼輸入(密碼由 Vault 動態注入),並透過 scp 確保檔案傳輸的完整性。針對測試環境,我們的目標 IP 為 <STAGING_IP>。
stage('Transfer & Deploy') {
steps {
withVault([configuration: vaultConfig, vaultSecrets: [[path: 'secret/deploy/target', secretValues: [[envVar: 'SSH_PASS', vaultKey: 'password']]]]]) {
script {
def targetIp = (params.DEPLOY_ENV == 'Prod') ? '<PROD_IP>' : '<STAGING_IP>'
sh """
# 1. 安全傳送產出物與元數據檔案至目標主機暫存區
sshpass -p $SSH_PASS scp -o StrictHostKeyChecking=no ${env.ZIP_NAME} deploy_params.json administrator@${targetIp}:D:/AP/Incoming/
# 2. 透過 SSH 觸發 Windows 任務排程器執行預定義的部署作業
sshpass -p $SSH_PASS ssh -o StrictHostKeyChecking=no administrator@${targetIp} "schtasks /run /tn DeploySite"
"""
}
}
}
}
針對生產環境 (Prod) 的變更,自動化應具備「安全閥」。透過 input 指令讓 Pipeline 在關鍵節點暫停,等待授權人員審查。
stage('Production Approval') {
when { expression { return params.DEPLOY_ENV == 'Prod' } }
steps {
script {
// 設定超時機制,若 2 小時內未獲核准則自動撤銷任務
timeout(time: 2, unit: 'HOURS') {
input message: "確認將專案 ${params.PROJECT_ID} 部署至正式環境?", ok: "執行部署"
}
}
}
}
部署完成後,系統應主動將結果回傳至開發者的工作介面(如 GitHub PR 頁面)。這能讓 Code Reviewer 即時得知部署狀態,並透過連結直接驗證功能成果。
post {
success {
script {
def demoUrl = (params.PR_NUMBER) ? "https://ci-cd.example.com/demo/${params.PROJECT_ID}-PR${params.PR_NUMBER}" : "https://ci-cd.example.com/demo/${params.PROJECT_ID}"
def comment = "🚀 **Deployment Successful!** \n\n- **Project**: ${params.PROJECT_ID} \n- **Env**: ${params.DEPLOY_ENV} \n- **Artifact**: ${env.ZIP_NAME} \n- **Demo URL**: ${demoUrl}"
// 透過 API 在 Pull Request 下方留言
withCredentials([string(credentialsId: 'github-token', variable: 'GITHUB_TOKEN')]) {
sh """
curl -X POST -H "Authorization: token ${GITHUB_TOKEN}" \
-d '{"body": "${comment}"}' \
"https://api.github.com/repos/my-org/my-repo/issues/${env.PR_NUMBER}/comments"
"""
}
}
}
}
在完成了管線端的實作後,明天的文章我們將深入探討 Windows 主機端是如何接收指令,並解析 DeploySite.ps1 部署腳本的設計精髓。